<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   主题：Advanced R programming手记  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript">
   MathJax.Hub.Config({elements: ["bbpress-forums"]});
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://cos.name/cn/topic/142077/",
                  host: "http://cos.name",
                  prePath: "http://cos.name",
                  scheme: "http",
                  pathBase: "http://cos.name/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466439216: Accept with keywords: (title(0.0):主题,手记,论坛, topn(0.266666666667):定义,帖子,手记,会员,实参,用户名,前缀,元素,例子,参数,作者,属性,函数,对象,环境,楼主,运算符,普通,原函数,返回值,语句,作用域,主题,词法,缺省值,查找,论坛,时候,讨论区,月珥).-->
 </head>
 <body class="topic bbpress single single-topic postid-142077 single-author sidebar" onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    主题：Advanced R programming手记
   </h1>
  </div>
  <div class="container" id="xmain">
   <div class="hfeed site" id="page">
    <header class="site-header" id="masthead" role="banner">
     <div id="cos-logo">
      <a href="http://cos.name/cn">
       <img src="http://cos.name/cn/wp-content/themes/COS-forest/images/headers/cos-logo.png"/>
      </a>
     </div>
     <div class="navbar" id="navbar">
      <nav class="navigation main-navigation" id="site-navigation" role="navigation">
       <h3 class="menu-toggle">
        菜单
       </h3>
       <div class="menu-%e8%8f%9c%e5%8d%951-container">
        <ul class="nav-menu" id="menu-%e8%8f%9c%e5%8d%951">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-407772" id="menu-item-407772">
          <a href="http://cos.name/cn/">
           论坛首页
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-407773" id="menu-item-407773">
          <a href="http://cos.name/cn/forums/">
           讨论区
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-407774" id="menu-item-407774">
          <a href="http://cos.name/cn/wp-login.php?action=register">
           注册
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-407819" id="menu-item-407819">
          <a href="http://cos.name/">
           主站
          </a>
         </li>
        </ul>
       </div>
      </nav>
      <!-- #site-navigation -->
     </div>
     <!-- #navbar -->
    </header>
    <!-- #masthead -->
    <div class="site-main" id="main">
     <div class="content-area" id="primary">
      <div class="site-content" id="content" role="main">
       <article class="post-142077 topic type-topic status-publish hentry" id="post-142077">
        <header class="entry-header">
         <h1 class="entry-title">
          Advanced R programming手记
         </h1>
        </header>
        <!-- .entry-header -->
        <div class="entry-content">
         <div id="bbpress-forums">
          <div class="bbp-breadcrumb">
           <p>
            <a class="bbp-breadcrumb-home" href="http://cos.name/cn/">
             COS论坛 | 统计之都
            </a>
            <span class="bbp-breadcrumb-sep">
             ›
            </span>
            <a class="bbp-breadcrumb-root" href="http://cos.name/cn/forums/">
             讨论区
            </a>
            <span class="bbp-breadcrumb-sep">
             ›
            </span>
            <a class="bbp-breadcrumb-forum" href="http://cos.name/cn/forum/software/">
             软件应用
            </a>
            <span class="bbp-breadcrumb-sep">
             ›
            </span>
            <a class="bbp-breadcrumb-forum" href="http://cos.name/cn/forum/software/r-language/">
             S-Plus &amp; R语言
            </a>
            <span class="bbp-breadcrumb-sep">
             ›
            </span>
            <span class="bbp-breadcrumb-current">
             Advanced R programming手记
            </span>
           </p>
          </div>
          <div class="bbp-template-notice info">
           <p class="bbp-topic-description">
            该主题包含 17 条回复，7个帖子，最后由
            <a class="bbp-author-avatar" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
             <img src="http://sdn.geekzu.org/avatar/9f8761804198aac65fc161f7cb157d00?s=14&amp;d=monsterid&amp;r=g"/>
            </a>
            <a class="bbp-author-name" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
             superdesolator
            </a>
            在
            <a href="http://cos.name/cn/topic/142077/page/2/#post-403543" title="回复：Advanced R programming手记">
             1 年, 12 月 之前
            </a>
            更新。
           </p>
          </div>
          <div class="bbp-pagination">
           <div class="bbp-pagination-count">
            查看 15 个帖子 - 1 到 15（总计 18 个）
           </div>
           <div class="bbp-pagination-links">
            <span class="page-numbers current">
             1
            </span>
            <a class="page-numbers" href="http://cos.name/cn/topic/142077/page/2/">
             2
            </a>
            <a class="next page-numbers" href="http://cos.name/cn/topic/142077/page/2/">
             →
            </a>
           </div>
          </div>
          <ul class="forums bbp-replies" id="topic-142077-replies">
           <li class="bbp-header">
            <div class="bbp-reply-author">
             作者
            </div>
            <!-- .bbp-reply-author -->
            <div class="bbp-reply-content">
             帖子
            </div>
            <!-- .bbp-reply-content -->
           </li>
           <!-- .bbp-header -->
           <li class="bbp-body">
            <div class="bbp-reply-header" id="post-142077">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月11日 下午9:05
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-142077">
               1 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-142077 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-1 user-id-382342 topic-author post-142077 topic type-topic status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               <img src="http://sdn.geekzu.org/avatar/ee9d702693a4bcfabadd687faf3046f8?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               yiluheihei
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               <strong>
                改了下格式, 应该好点了 2013/12/13
               </strong>
              </p>
              <p>
               最近在看Hadley Wickham的
               <a href="http://adv-r.had.co.nz" rel="nofollow">
                Advanced R programming
               </a>
               , 初看前面数据结构以及寻值还没觉得什么, 到关于函数和OOP的时候发现好多知识并不太了解,甚至有的没听说过, 毕竟是E文的随手记了些东西, 权当抛个转引个玉. 先把关于函数这一章贴出来,如果有人觉得还有那么一点点用的话, 会考虑把nutshell这本书的笔记和Advanced R programming整理在一起继续发出来
              </p>
              <p>
               还有很重要的一点, 本人E文不咋地加上看网上看电子版随手记下, 肯定有的地方写的不妥, 欢迎扔砖头
              </p>
              <p>
               扯淡扯够了, 进入正文吧:
              </p>
              <p>
              </p>
              <center>
               <strong>
                Functions
               </strong>
              </center>
              <p>
              </p>
              <p>
               我们所说的函数一般是closures, 源自于LISP, 仅仅是为了与R的原函数（primitive function)区分
              </p>
              <p>
               <strong>
                一、函数共有的属性
               </strong>
              </p>
              <p>
               closures函数都具有三种属性
              </p>
              <ul>
               <li>
                body(), 返回函数体,显然跟在console中直接输入函数名一样
               </li>
               <li>
                formals(), 形参, 如何调用参数, pairlist, 每一个参数对应了一个value，因而可以使用alist改变函数的参数
               </li>
               <li>
                environment(), 函数中变量的作用环境，如果没有指明函数的环境，默认为Globalenv也就是workspace
                <br/>
                这三个属性都可以改变函数
               </li>
              </ul>
              <p>
              </p>
              <pre class="highlight ">f &lt;- function(x, y = 1, z = 2) {
    x + y + z
}
formals(f) &lt;- alist(x = , y = 100, z = 200)
f
## function (x, y = 100, z = 200)
## {
##     x + y + z
## }
body(f)
## {
##     x + y + z
## }
</pre>
              <p>
               <strong>
                二、原函数
               </strong>
              </p>
              <p>
               原函数除了上述三个属性，还包括了.Primitive(), 纯粹用c编写, 全都在base包中, 如sum()和.Primitive(“sum”)()一个意思, 貌似不管我们的事
              </p>
              <pre class="highlight ">## 显示所有原函数
ls("package:base", all = TRUE)
</pre>
              <p>
               <strong>
                三、作用域
               </strong>
              </p>
              <p>
               作用域决定了R中符号(symbol)如何去寻值, 两种类型作用域, language level：lexical scoping(词典还是词汇什么什么的作用域实在不知道怎么翻译), 结合在一起来构建函数; 在交互分析中节省type的动态作用域dynamic scoping, computing on the language ?语言计算
              </p>
              <p>
               词法作用域的寻值方式是由函数的构建方式决定, 通过查看函数的定义就可知道如何寻值, 感觉就是一句话函数的值调用
              </p>
              <p>
               Advanced R programming对于lexical的说明:
              </p>
              <blockquote>
               <p>
                The “lexical” in lexical scoping doesn’t correspond to the usual English definition (“of or relating to words or the vocabulary of a language as distinguished from its grammar and construction”) but comes from the computer science term “lexing”, which is part of the process that converts code represented as text to meaningful pieces that the programming language understands. R’s lexical scoping is lexical in this sense because you only need the definition of the functions, not how they are called.
               </p>
              </blockquote>
              <p>
               <strong>
                四、函数变量寻值
               </strong>
              </p>
              <p>
               四个基本原则
              </p>
              <p>
               首先在本函数内部，然后到上一层env，可以是f或者env，直至globalenv，最后是load的其他的package
              </p>
              <p>
               对于函数
              </p>
              <pre class="highlight ">## 返回一个function
j &lt;- function(x) {
    y &lt;- 2
    function() {
        c(x, y)
    }
}
k &lt;- j(1)
k
## function() {
##         c(x, y)
##     }
## &lt;environment: 0x0344b5c8&gt;
k()
## [1] 1 2
rm(j, k)
</pre>
              <p>
               这是因为函数k记录着自己的作用环境，因为y的值可以捕捉到
              </p>
              <p>
               <strong>
                五、每一个操作符都是一个函数
               </strong>
               <strong>
               </strong>
              </p>
              <strong>
               <blockquote>
                <p>
                 To understand computations in R, two slogans are helpful:
                </p>
                <p>
                 Everything that exists is an object.
                 <br/>
                 Everything that happens is a function call.
                 <br/>
                 — John Chambers
                </p>
               </blockquote>
               <p>
                曾经用apply的时候经常定义函数function(x)x[2] 其实更简单的是用”[“
               </p>
               <p>
               </p>
               <pre class="highlight ">x &lt;- list(1:3, 4:9, 10:12)
sapply(x, "[", 2)
## [1]  2  5 11
sapply(x, function(x) x[2])
## [1]  2  5 11
</pre>
               <p>
               </p>
              </strong>
              <p>
               <strong>
               </strong>
               <strong>
                六、参数
               </strong>
              </p>
              <p>
               首先匹配名词完全相同, 然后是模糊匹配 可以写一个参数的前缀 模糊匹配强烈反对 代码可读性 如果两个参数前缀一样也会出错, 最后按参数的位置
              </p>
              <pre class="highlight ">f &lt;- function(abcdef, bcde1, bcde2) {
    list(a = abcdef, b1 = bcde1, b2 = bcde2)
}
str(f(1, 3, b = 1))
## Error: argument 3 matches multiple formal arguments
</pre>
              <p>
               如果参数是list df, do.call, 这个楼主经常用, 其实Reduce()也可以实现, 个人感觉Reduce()还是很强大的, 有兴趣的去”?Reduce”
              </p>
              <p>
              </p>
              <pre class="highlight ">do.call(mean, list(1:5))
## [1] 3
do.call(cbind, list(c(1, 2), c(2, 3)))
##      [,1] [,2]
## [1,]    1    2
## [2,]    2    3
cbin &lt;- function(x)Reduce("cbind", x)
cbin(list(c(1, 2), c(2, 3)))
##      init
## [1,]    1 2
## [2,]    2 3
</pre>
              <p>
              </p>
              <p>
               参数缺省值, 在定义函数的时候赋值给参数, 甚至可以在函数内部定义缺省值(蛋疼)
              </p>
              <p>
              </p>
              <pre class="highlight ">h &lt;- function(a = 1, b = d) {
    d &lt;- (a + 1)^2
    c(a, b)
}
h()
## [1] 1 4
# &gt; [1] 1 4
h(10)
## [1]  10 121
# &gt; [1] 10 121
</pre>
              <p>
              </p>
              <p>
               如果定义了参数，在调用的时候不用, 在函数定义的时候要定义 missing(arg)函数如何计算,missing()只用于函数的构建 不建议使用missing, 不如设立缺省值NULL, 在函数内部用 is.null(arg)
              </p>
              <p>
               <strong>
                七、R计算的懒惰性
               </strong>
              </p>
              <p>
              </p>
              <pre class="highlight ">f &lt;- function(x) {
    10
}
system.time(f(Sys.sleep(10)))
##    user  system elapsed
##       0       0       0
因为x并没有没用到，所以函数兵没有执行，可以通过force()来强制执行
f &lt;- function(x) {
    force(x)
    10
}
system.time(f(Sys.sleep(10)))
##    user  system elapsed
##       0       0      10
更有趣的一个例子
add &lt;- function(x) {
    function(y) x + y
}
adders &lt;- lapply(1:10, add)
adders[[1]](10)
## [1] 20
adders[[10]](10)
## [1] 20
</pre>
              <p>
              </p>
              <p>
               在调用add函数的时候, x并没有被evaluate, 所以直至lapp完成x =10, 在add加一句fix(x)会得到正常结果11:20
              </p>
              <p>
               还需要注意的是默认参数是在函数内部环境中寻值的
              </p>
              <p>
              </p>
              <pre class="highlight ">f &lt;- function(x = ls()) {
    a &lt;- 1
    x
}
# ls() evaluated inside f:
f()
## [1] "a" "x"
# ls() evaluated in global environment:
f(ls())
## [1] "add"    "adders" "f"      "h"      "x"
</pre>
              <p>
              </p>
              <p>
               不知道谁会这样定义参数
              </p>
              <p>
               一个没有被evaluate的参数在R中称为promise pryr::promise_info可以查看promise的信息
              </p>
              <p>
               lazy这个特性在if语句中非常有用
              </p>
              <p>
              </p>
              <pre class="highlight ">x &lt;- NULL
if (!is.null(x) &amp;&amp; x &gt; 0) {
}
</pre>
              <p>
              </p>
              <p>
               NULL &gt; 0是长度为0的逻辑向量, 并不能用于if中，甚至有时候可以避免使用if语句
              </p>
              <p>
              </p>
              <pre class="highlight ">if (is.null(a)) stop("a is null")
## Error: object 'a' not found
!is.null(a) || stop("a is null")
## Error: object 'a' not found
</pre>
              <p>
              </p>
              <p>
               <strong>
                八、…
               </strong>
              </p>
              <p>
               …代表了所有的其他的参数，可以传递给所调用的函数，也可以是自己定义的参数, 最大的用处就是参数传递，省得把所有参数都写上, 但是错误的参数不会报错(都被…吸收了), 如果哪位童鞋编写过自己的Package”…”应该经常用
              </p>
              <p>
               <strong>
                九、特殊运算符
               </strong>
              </p>
              <p>
               大多数函数参数都是在函数名之后, 什么 + -等显然不是， 我们也可以自定义这种特殊运算符，以%开头结尾, 定义函数的时候函数名-引号
              </p>
              <p>
               替代函数, 通常含有两个参数，用于修改它的一个参数，返回值则是这个已改变的参数对象
              </p>
              <p>
              </p>
              <pre class="highlight ">"second&lt;-" &lt;- function(x, value) {
    x[2] &lt;- value
    x
}
x &lt;- 1:10
second(x) &lt;- 5L
x
##  [1]  1  5  3  4  5  6  7  8  9 10
</pre>
              <p>
              </p>
              <p>
               显然names()什么的属于这一类
              </p>
              <p>
               <strong>
                十、返回值
               </strong>
              </p>
              <p>
               函数最主要的就是只调用, 只有返回值影响其工作环境,copy-on-modify semantics
              </p>
              <p>
               env和引用类除外
              </p>
              <ul>
               <li>
                library引入新的对象, 函数data等
               </li>
               <li>
                setwd, Sys.setenv, Sys.setlocale 改变环境变量 工作目录 语言环境
               </li>
               <li>
                plot 图形输出
               </li>
               <li>
                write, write.csv, saveRDS etc 保存数据
               </li>
               <li>
                options par 改变全局设置
               </li>
               <li>
                S4 的相关函数 改变全局的类和方法
               </li>
               <li>
                随机数发生器
               </li>
               <p>
                可以使用invisibleprint的时候不显示返回值, 加上()可以强制显示
               </p>
               <p>
               </p>
               <pre class="highlight ">a &lt;- 2
(a &lt;- 2)
## [1] 2
# &gt; [1] 2
</pre>
               <p>
               </p>
               <p>
                on.exit()也可以跳出函数不如tryCatch
               </p>
               <p>
                一定要注意的是要加add = TRUE不然会替代前一个调用但是默认参数为FALSE,不推荐使用
               </p>
              </ul>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-384848">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 上午5:52
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-384848">
               2 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-384848 -->
            <div class="even bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-2 user-id-377380 post-384848 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
               <img src="http://sdn.geekzu.org/avatar/9f8761804198aac65fc161f7cb157d00?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
               superdesolator
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第1楼 的 yiluheihei：好东西,希望楼主可以整理好一点,尽量把知识点分开弄,然后举例说明哈!不然我们这种新手很难一下子理解
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-384860">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 上午6:50
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-384860">
               3 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-384860 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-3 user-id-382342 topic-author post-384860 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               <img src="http://sdn.geekzu.org/avatar/ee9d702693a4bcfabadd687faf3046f8?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               yiluheihei
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第2楼 的 superdesolator：开始是用Rmd写的, 比较懒就直接给粘过来了, 晚上有空会编辑一下加上html的h元素
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385073">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 上午11:00
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385073">
               4 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385073 -->
            <div class="even bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-4 user-id-377380 post-385073 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
               <img src="http://sdn.geekzu.org/avatar/9f8761804198aac65fc161f7cb157d00?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
               superdesolator
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第3楼 的 yiluheihei：嗯,内容比较适合我这样的菜鸟进阶型选手[s:11]
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385204">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 下午2:00
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385204">
               5 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385204 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-5 user-id-108494 post-385204 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/108494/" rel="nofollow" title="查看月珥的档案">
               <img src="http://sdn.geekzu.org/avatar/bcf35e0c682e249dd0a679fa839d124a?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/108494/" rel="nofollow" title="查看月珥的档案">
               月珥
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               说起来我第一次亲眼见到返回值为函数的函数，就是在Hadley大神的scales包里……
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385249">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 下午3:03
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385249">
               6 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385249 -->
            <div class="even bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-6 user-id-377597 post-385249 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/377597/" rel="nofollow" title="查看neo.cryptic的档案">
               <img src="http://sdn.geekzu.org/avatar/200ed4b091dc039241caa5985a0df69a?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/377597/" rel="nofollow" title="查看neo.cryptic的档案">
               neo.cryptic
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               这个很不错！顶一下
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385251">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 下午3:08
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385251">
               7 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385251 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-7 user-id-377380 post-385251 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
               <img src="http://sdn.geekzu.org/avatar/9f8761804198aac65fc161f7cb157d00?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/377380/" rel="nofollow" title="查看superdesolator的档案">
               superdesolator
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第5楼 的 月珥：呵呵,我是今看到这个帖子….
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385255">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 下午3:16
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385255">
               8 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385255 -->
            <div class="even bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-8 user-id-377597 post-385255 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/377597/" rel="nofollow" title="查看neo.cryptic的档案">
               <img src="http://sdn.geekzu.org/avatar/200ed4b091dc039241caa5985a0df69a?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/377597/" rel="nofollow" title="查看neo.cryptic的档案">
               neo.cryptic
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <blockquote>
               <p>
                “In fact, the fundamental design principle underlying R (and S) is “everything
                <br/>
                is an object”. Hence, not only vectors and matrices are objects that
                <br/>
                can be passed to and returned by functions, but also functions themselves,
                <br/>
                and even function calls.”
               </p>
              </blockquote>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385259">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 下午3:34
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385259">
               9 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385259 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-9 user-id-375409 post-385259 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/375409/" rel="nofollow" title="查看zggjtsgzczh的档案">
               <img src="http://sdn.geekzu.org/avatar/79fd3c1e1ddfb0a43ba2d937049e5513?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/375409/" rel="nofollow" title="查看zggjtsgzczh的档案">
               zggjtsgzczh
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第8楼 的 neo.cryptic：
               <br/>
               source[s:16]
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385261">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 下午3:39
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385261">
               10 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385261 -->
            <div class="even bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-10 user-id-377597 post-385261 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/377597/" rel="nofollow" title="查看neo.cryptic的档案">
               <img src="http://sdn.geekzu.org/avatar/200ed4b091dc039241caa5985a0df69a?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/377597/" rel="nofollow" title="查看neo.cryptic的档案">
               neo.cryptic
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第9楼 的 zggjtsgzczh：Springer的Use R!系列的《Applied Econometrics with R》
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385288">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月12日 下午7:03
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385288">
               11 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385288 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-11 user-id-382342 topic-author post-385288 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               <img src="http://sdn.geekzu.org/avatar/ee9d702693a4bcfabadd687faf3046f8?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               yiluheihei
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第4楼 的 superdesolator：我也是工作需要最近一年才正式用R, 没事的时候看看大牛的个人主页 最近迷上了谢老大的knitr
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385403">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月13日 上午2:25
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385403">
               12 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385403 -->
            <div class="even bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-12 user-id-367692 post-385403 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/367692/" rel="nofollow" title="查看lovecos的档案">
               <img src="http://sdn.geekzu.org/avatar/5c63155f0aa70c0671fa57844c846f0b?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/367692/" rel="nofollow" title="查看lovecos的档案">
               lovecos
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               自己也正在学习，共同学习！[s:13]
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385950">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月15日 上午4:04
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385950">
               13 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385950 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-13 user-id-367692 post-385950 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/367692/" rel="nofollow" title="查看lovecos的档案">
               <img src="http://sdn.geekzu.org/avatar/5c63155f0aa70c0671fa57844c846f0b?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/367692/" rel="nofollow" title="查看lovecos的档案">
               lovecos
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第1楼 的 yiluheihei：
               <br/>
               求教一下：
               <br/>
               关于其中的lazy evaluation中前一个例子还好理解，但是后面的关于adder的例子则
               <br/>
               不好懂了。
              </p>
              <pre class="highlight ">add1 &lt;- add(1)
add2 &lt;- add(2)
add1(10)
# 结果为11
add2(10)
# 结果为12
</pre>
              <p>
               上面的例子和作者的例子区别在哪呢？
              </p>
              <p>
               我感觉在用lapply()时，同样也把1：10一个个传给add(),然后x依次等于1：10，并且
               <br/>
               利用x才能生成adders列表的一个个元素。这里x用到了啊？求解释！
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385953">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月15日 上午7:45
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385953">
               14 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385953 -->
            <div class="even bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-14 user-id-94146 post-385953 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/94146/" rel="nofollow" title="查看manxingxing的档案">
               <img src="http://sdn.geekzu.org/avatar/b55bbd208c03adaa7026b3c980889651?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/94146/" rel="nofollow" title="查看manxingxing的档案">
               manxingxing
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第13楼 的 lovecos：以前看的时候也有同样的疑惑. 现在感觉这个和lapply的行为非常相关．
              </p>
              <p>
               在返回adders函数系列的时候，x 的确没有使用，只有当这些函数被调用的时候，x 才会求值，这正是Lazy evaluation的行为．
              </p>
              <p>
               拿add1函数为例，当调用add1(10)被执行时，x开始求值．但add1函数定义内并没有ｘ的定义，只能向上层环境中查找(词法作用域)．上层环境是add()函数的执行环境(每执行一次，这个环境都不相同)，这里x是一个实参，它的值是在add()的被调用环境中查找的(非默认实参的求值环境)，这个＂被调用环境＂就是lapply里面．在lapply执行完成时，x的值是10，所以add1(10) =&gt; 20.
              </p>
              <p>
               整个过程里最难理解的就是lapply是怎么把1:10的每个元素传递给add函数的．不过可以肯定的是：它传递的肯定不是1, 2, 3… 这些值．如楼主所说，参数被求值之前是一个promise对象，所以这和promise对象的行为应该也有关系．但lapply最终调用一个.Internal(lapply)，要想知道它的运行机制，可能需要去看R的源代码了．
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
            <div class="bbp-reply-header" id="post-385980">
             <div class="bbp-meta">
              <span class="bbp-reply-post-date">
               2013年12月16日 上午1:30
              </span>
              <a class="bbp-reply-permalink" href="http://cos.name/cn/topic/142077/#post-385980">
               15 楼
              </a>
              <span class="bbp-admin-links">
              </span>
             </div>
             <!-- .bbp-meta -->
            </div>
            <!-- #post-385980 -->
            <div class="odd bbp-parent-forum-999 bbp-parent-topic-142077 bbp-reply-position-15 user-id-382342 topic-author post-385980 reply type-reply status-publish hentry">
             <div class="bbp-reply-author">
              <a class="bbp-author-avatar" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               <img src="http://sdn.geekzu.org/avatar/ee9d702693a4bcfabadd687faf3046f8?s=80&amp;d=monsterid&amp;r=g"/>
              </a>
              <br/>
              <a class="bbp-author-name" href="http://cos.name/cn/profile/382342/" rel="nofollow" title="查看yiluheihei的档案">
               yiluheihei
              </a>
              <br/>
              <div class="bbp-author-role">
               普通会员
              </div>
             </div>
             <!-- .bbp-reply-author -->
             <div class="bbp-reply-content">
              <p>
               回复 第13楼 的 lovecos：我的理解跟14楼差不多, 当lapply作用于函数add时
              </p>
              <pre class="highlight "># 没有用到x且函数的返回值是一个function, 就没在环境中寻找x的值, 会返回function(y)x+y
 function(y)x+y
</pre>
              <p>
               `
               <br/>
               lapply之后在add()函数的函数的环境中x是10,
              </p>
              <pre class="highlight ">adders[[1]] &lt;- function(y)x+y
# 返回一个数值, 依次从adders函数到父环境中寻值x=10
adders[[1]](10)
## 20
</pre>
              <p>
               不晓得对不对
               <br/>
               `
              </p>
             </div>
             <!-- .bbp-reply-content -->
            </div>
            <!-- .reply -->
           </li>
           <!-- .bbp-body -->
           <li class="bbp-footer">
            <div class="bbp-reply-author">
             作者
            </div>
            <div class="bbp-reply-content">
             帖子
            </div>
            <!-- .bbp-reply-content -->
           </li>
           <!-- .bbp-footer -->
          </ul>
          <!-- #topic-142077-replies -->
          <div class="bbp-pagination">
           <div class="bbp-pagination-count">
            查看 15 个帖子 - 1 到 15（总计 18 个）
           </div>
           <div class="bbp-pagination-links">
            <span class="page-numbers current">
             1
            </span>
            <a class="page-numbers" href="http://cos.name/cn/topic/142077/page/2/">
             2
            </a>
            <a class="next page-numbers" href="http://cos.name/cn/topic/142077/page/2/">
             →
            </a>
           </div>
          </div>
          <div class="bbp-no-reply" id="no-reply-142077">
           <div class="bbp-template-notice">
            <p>
             您必须先登录才能回复该主题。
            </p>
           </div>
          </div>
         </div>
        </div>
        <!-- .entry-content -->
        <footer class="entry-meta">
        </footer>
        <!-- .entry-meta -->
       </article>
       <!-- #post -->
       <div class="comments-area" id="comments">
       </div>
       <!-- #comments -->
      </div>
      <!-- #content -->
     </div>
     <!-- #primary -->
     <div class="sidebar-container" id="tertiary" role="complementary">
      <div class="sidebar-inner">
       <div class="widget-area">
        <aside class="widget bbp_widget_login" id="bbp_login_widget-2">
         <h3 class="widget-title">
          登录
         </h3>
         <form action="http://cos.name/cn/wp-login.php" class="bbp-login-form" method="post">
          <fieldset>
           <legend>
            登录
           </legend>
           <div class="bbp-username">
            <label for="user_login">
             用户名:
            </label>
           </div>
           <div class="bbp-password">
            <label for="user_pass">
             密码:
            </label>
           </div>
           <div class="bbp-remember-me">
            <label for="rememberme">
             记住用户名
            </label>
           </div>
           <div class="bbp-submit-wrapper">
            <button class="button submit user-submit" id="user-submit" name="user-submit" tabindex="104" type="submit">
             登录
            </button>
           </div>
           <div class="bbp-login-links">
            <a class="bbp-register-link" href="http://cos.name/cn/wp-login.php?action=register" title="注册">
             注册
            </a>
            <a class="bbp-lostpass-link" href="http://cos.name/cn/wp-login.php?action=lostpassword" title="忘记密码">
             忘记密码
            </a>
           </div>
          </fieldset>
         </form>
        </aside>
        <aside class="widget widget_text" id="text-7">
         <h3 class="widget-title">
          搜索
         </h3>
         <div class="textwidget">
          <form action="http://www.google.com/search" id="bbp-search-form" method="get" onsubmit="Gsitesearch(this)" role="search">
           <div>
           </div>
          </form>
          <form id="bbp-search-form-baidu" onsubmit="g(this)" role="search">
           <div>
           </div>
          </form>
         </div>
        </aside>
        <aside class="widget widget_text" id="text-2">
         <h3 class="widget-title">
          新鲜事
         </h3>
         <div class="textwidget">
          <ul>
           <li>
            <a href="http://cos.name/cn/topics/">
             最新帖子
            </a>
           </li>
           <li>
            <a href="http://cos.name/cn/view/popular/">
             最热门主题
            </a>
           </li>
           <li>
            <a href="http://cos.name/cn/view/no-replies/">
             消灭零回复
            </a>
           </li>
          </ul>
         </div>
        </aside>
        <aside class="widget widget_text" id="text-3">
         <h3 class="widget-title">
          RSS订阅
         </h3>
         <div class="textwidget">
          <ul>
           <li>
            <img src="http://cos.name/wp-includes/images/rss.png"/>
            <a href="http://cos.name/cn/topics/feed/">
             所有主题
            </a>
           </li>
           <li>
            <img src="http://cos.name/wp-includes/images/rss.png"/>
            <a href="http://cos.name/cn/forums/feed/">
             所有帖子
            </a>
           </li>
          </ul>
         </div>
        </aside>
       </div>
       <!-- .widget-area -->
      </div>
      <!-- .sidebar-inner -->
     </div>
     <!-- #tertiary -->
    </div>
    <!-- #main -->
    <footer class="site-footer" id="colophon" role="contentinfo">
     <div class="site-info">
      版权所有 © 2014 统计之都 | 由
      <a href="http://wordpress.org/">
       WordPress
      </a>
      构建 | 主题修改自
      <a href="http://wordpress.org/themes/twentythirteen">
       Twenty Thirteen
      </a>
     </div>
     <!-- .site-info -->
    </footer>
    <!-- #colophon -->
   </div>
   <!-- #page -->
  </div>
 </body>
</html>